package com.progscrape.ui; import android.app.AlertDialog; import android.app.DownloadManager; import android.content.Context; import android.content.DialogInterface; import android.net.Uri; import android.os.Bundle; import android.os.Parcelable; import android.util.AttributeSet; import android.view.View; import android.webkit.DownloadListener; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import com.google.common.collect.ImmutableMap; import com.progscrape.MainActivity; import com.progscrape.R; import com.progscrape.modules.Injector; import java.util.HashMap; import javax.inject.Inject; import butterknife.ButterKnife; import butterknife.InjectView; public class BrowserView extends LinearLayout implements ActivityPauseNotifier.ActivityPauseNotification { @InjectView(R.id.browser) WebView browser; @InjectView(R.id.title) TextView title; @InjectView(R.id.progress) ProgressBar progress; @Inject MainActivity activity; private String titleText; private String href; public BrowserView(Context context, AttributeSet attrs) { super(context, attrs); if (isInEditMode()) return; Injector.obtain(context, ActivityComponent.class).inject(this); } @Override protected Parcelable onSaveInstanceState() { Bundle bundle = new Bundle(); bundle.putString("title", titleText); bundle.putString("href", href); bundle.putParcelable("super", super.onSaveInstanceState()); Bundle web = new Bundle(); bundle.putBundle("browser", web); browser.saveState(web); return bundle; } @Override protected void onRestoreInstanceState(Parcelable state) { Bundle bundle = (Bundle) state; super.onRestoreInstanceState(bundle.getParcelable("super")); this.href = bundle.getString("href"); this.title.setText(titleText = bundle.getString("title")); browser.restoreState(bundle.getBundle("browser")); } public void onPause() { browser.onPause(); } public void onResume() { browser.onResume(); } @Override protected void onFinishInflate() { super.onFinishInflate(); if (isInEditMode()) return; ButterKnife.inject(this); progress.setIndeterminate(true); setupBrowser(); } private void setupBrowser() { WebSettings settings = browser.getSettings(); settings.setJavaScriptEnabled(true); settings.setSupportZoom(true); settings.setDisplayZoomControls(false); settings.setBuiltInZoomControls(true); settings.setUseWideViewPort(true); browser.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress == 0) { progress.setVisibility(View.VISIBLE); progress.setIndeterminate(true); } else if (newProgress == 100) { progress.setVisibility(View.GONE); } else { progress.setVisibility(View.VISIBLE); progress.setIndeterminate(false); progress.setProgress(newProgress); } } }); browser.setWebViewClient(new WebViewClient()); browser.setDownloadListener(new DownloadListener() { @Override public void onDownloadStart(final String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setMessage("Unable to view " + mimetype + ". Download the file instead?") .setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { DownloadManager dm = (DownloadManager) getContext().getSystemService(Context.DOWNLOAD_SERVICE); dm.enqueue(new DownloadManager.Request(Uri.parse(url))); back(); } }).setNegativeButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { back(); } }).show(); } }); } private void back() { activity.getFragmentManager().popBackStack(); } public void setPage(String href, String title) { this.titleText = title; if (this.href == null || !this.href.equals(href)) { this.href = href; this.browser.loadUrl(href, new HashMap<>(ImmutableMap.of("Referer", "http://www.progscrape.com/"))); } this.title.setText(title); } }